﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;



namespace Recette
{
    public partial class NouvelleRecette : Form
    {
        bool modifQte = false;
        int indexRow = 0;
        public NouvelleRecette()
        {

            ObjectResult<TSQLIngredient> getIngredient;
            ObjectResult<String> getType;
            ObjectResult<String> getRef;
            ObjectResult<String> getSaison;
            ObjectResult<String> getMois;
            ObjectResult<String> getAllType;

            BddRecettesEntities bddEntity = new BddRecettesEntities();
            

            getIngredient = bddEntity.getAllIngredient();
            getType = bddEntity.getAllType();
            getRef = bddEntity.getAllRef();
            getSaison = bddEntity.getAllSaison();
            getMois = bddEntity.getAllMois();
            getAllType = bddEntity.getAllTypeRecette();

            List<TSQLIngredient> TSQLListIng = getIngredient.ToList();
            List<String> listType = getType.ToList();
            List<String> listRef = getRef.ToList();
            List<String> listSaison = getSaison.ToList();
            List<String> listMois = getMois.ToList();
            List<String> listTypeRecette = getAllType.ToList();


          



            InitializeComponent();
            buttonValider.Enabled = false;
            //Initialisation TreeView
        
         
            
            remplirTreeIng();
          

            AddCombo(comboBoxType,listType);
            AddCombo(comboBoxRef, listRef);
            AddCombo(comboBoxSaison, listSaison);
            AddCombo(comboBoxMois, listMois);
            AddCombo(comboBoxTypeRecette,listTypeRecette);

                bddEntity.Dispose();
         

        }

        private void AddCombo(ComboBox box, List<String> list)
        {
            //Initialisation comboBox
            foreach (String s in list)
                box.Items.Add(s);
        }

        private void buttonSuivant_Click(object sender, EventArgs e)
        {
            TreeNode node = treeViewIngredient.SelectedNode;
            if (node.Parent == null)
                MessageBox.Show("Impossible");
            else
                labelIng.Text = node.Text;

            buttonValider.Enabled = true;
        }

        private void buttonValider_Click(object sender, EventArgs e)
        {
            if (comboBoxType.Text == "")
            {
                MessageBox.Show("Impossible de continuer, le type est inéxistant");
                return;
            }
            
            foreach (ListViewItem item in listViewIng.Items)
            {
                if (item.SubItems[0].Text == labelIng.Text && modifQte == false)
                {
                    MessageBox.Show("Ingrédients éxistant");
                    reiniControl();
                    return;
                }
            }
            
            if (comboBoxType.FindString(comboBoxType.Text)==-1)
                {
                    
                  DialogResult result =  MessageBox.Show("Voulez-vous ajouter le type : "+comboBoxType.Text+" ? ","Ajout d'un type", MessageBoxButtons.YesNo,MessageBoxIcon.Question);
                    if(result == DialogResult.No)
                        return;

                    if (result == DialogResult.Yes)
                    {
                       
                        comboBoxType.Items.Add(comboBoxType.Text);
                        comboBoxType.SelectedItem = comboBoxType.Text;
                        BddRecettesEntities entity = new BddRecettesEntities();
                        typeQte typeQte = new typeQte();
                        typeQte.nomType = comboBoxType.Text;
                        entity.AddTotypeQte(typeQte);
                        if (entity.SaveChanges() != 0)
                            MessageBox.Show("L'élément " + comboBoxType.Text + " a été ajouté avec succés", "Succés",0,MessageBoxIcon.Asterisk);
                        else
                            MessageBox.Show("L'élément " + comboBoxType.Text + " n'a pu être enregistré dans la base de donnée..", "Succés", 0, MessageBoxIcon.Asterisk);

                        entity.Dispose();
                    }
                        
                
            }
            
            
            
         

            if (modifQte == false)
            {
                if (numericQte.Value == 0)
                {
                    MessageBox.Show("Impossible d'avoir une quantitée nulle");
                    return;
                }


                ListViewItem item = new ListViewItem(new[] { labelIng.Text, numericQte.Value.ToString(), comboBoxType.SelectedItem.ToString() });
                listViewIng.Items.Add(item);
            }

            else
            {
                modifQte = false;
                listViewIng.Items[indexRow].SubItems[1].Text = numericQte.Value.ToString();
                listViewIng.Items[indexRow].SubItems[2].Text = comboBoxType.SelectedItem.ToString();
                indexRow = 0;
            }

            reiniControl();

            
        }

        private void reiniControl()
        {
            buttonValider.Enabled = false;
            labelIng.Text = "";
            comboBoxType.SelectedItem = null;


            numericQte.Value = 0;
        }


        private void toolStripMenuModifQte_Click(object sender, EventArgs e)
        {
            ListView.SelectedListViewItemCollection listItem = listViewIng.SelectedItems;
            if (listItem.Count != 1)
            {
                MessageBox.Show("Vous devez choisir un seul ingrédient");
                reiniControl();
            
             
                return;
            }

            ListView.SelectedIndexCollection indice = listViewIng.SelectedIndices;

            foreach (int item in indice)
                indexRow = item;

         
            foreach (ListViewItem item in listItem)
            {
                buttonValider.Enabled = true;
                labelIng.Text = item.SubItems[0].Text;
                numericQte.Value = 0;
                comboBoxType.SelectedItem = item.SubItems[2];
                
            }

            modifQte = true;
           
        
        }

        private void toolStripMenuItemSupp_Click(object sender, EventArgs e)
        {

            foreach (ListViewItem item in listViewIng.SelectedItems)
                item.Remove();

            reiniControl();
            
           
        }

      
        private void comboBoxRef_Validated(object sender, EventArgs e)
        {
            if (comboBoxRef.FindString(comboBoxRef.Text) == -1)
            {

                DialogResult result = MessageBox.Show("Voulez-vous ajouter le type : " + comboBoxRef.Text + " ? ", "Ajout d'un type", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == DialogResult.No)
                    return;

                if (result == DialogResult.Yes)
                {

                    comboBoxRef.Items.Add(comboBoxRef.Text);
                    comboBoxRef.SelectedItem = comboBoxRef.Text;
                    BddRecettesEntities entity = new BddRecettesEntities();
                    Magazine mag = new Magazine();
                    mag.nomMag = comboBoxRef.Text;
                    entity.AddToMagazine(mag);
                    if (entity.SaveChanges() != 0)
                        MessageBox.Show("La référence " + comboBoxRef.Text + " a été ajouté avec succés", "Succés", 0, MessageBoxIcon.Asterisk);
                    else
                        MessageBox.Show("La référence " + comboBoxRef.Text + " n'a pu être enregistré dans la base de donnée..", "Succés", 0, MessageBoxIcon.Exclamation);

                    entity.Dispose();
                }
            }
        }

      

        private bool ErreurCombo(ComboBox box)
        {
            if (box.Text.Length == 0)
            {
                MessageBox.Show("Un renseignement est manquant..", "Echec", 0, MessageBoxIcon.Exclamation);
                box.BackColor = Color.Red;
                return true;   
            }
            return false;
        }

        private void buttonAjout_Click(object sender, EventArgs e)
        {
            iniCouleur();
            //Vérification que le nom de la recette n'est pas vide.
            if (textBoxTitre.Text.Length < 10)
            {
                MessageBox.Show("Le titre de la recette doit contenir au moins 10 caractères..", "Echec", 0, MessageBoxIcon.Exclamation);
                textBoxTitre.BackColor = Color.Red;
                return;
            }

            if(ErreurCombo(comboBoxTypeRecette)) return;
            if (ErreurCombo(comboBoxMois)) return;
            if (ErreurCombo(comboBoxRef)) return;
            if (ErreurCombo(comboBoxSaison)) return;

            /**
             * Ajout du code 080511
             */
            //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            if (listViewIng.Items.Count == 0 || numericNbPersonne.Value==0 || (numericHCuiss.Value==0 && numericMCuiss.Value==0) || (numericMCuiss.Value==0 && numericHCuiss.Value==0))
            {
                MessageBox.Show("Un renseignement est manquant..", "Echec", 0, MessageBoxIcon.Exclamation);
                return;
            }

           
            //Ici le formulaire est bien rempli, on insere alors dans la base de donnée.


            //Creation de la recette
            createRecette();
            this.Dispose();
          
        }

        private void createRecette()
        {
            try
            {


                BddRecettesEntities entitie = new BddRecettesEntities();

                Recettes newRecette = new Recettes();

                newRecette.NomRecette = textBoxTitre.Text;
                newRecette.idSaison = entitie.getIdSaison(comboBoxSaison.Text).ToList().First();
                newRecette.nbPersonne = (int)numericNbPersonne.Value;
                newRecette.idMagazine = entitie.getIdMagazine(comboBoxRef.Text).ToList().First();
                newRecette.idMoisMag = entitie.getIdMois(comboBoxMois.Text).ToList().First();
                

                //Insertion de la technique
                if (richTextBoxTechnique.Text != "")
                {
                    Technique technique = new Technique();

                    technique.uneTechnique = richTextBoxTechnique.Text;
                    entitie.AddToTechnique(technique);
                    entitie.SaveChanges();
                    newRecette.idTechnique = technique.idTechnique;

                }


                newRecette.idTypeRecette = (int)entitie.getIdTypeRecette(comboBoxTypeRecette.Text).ToList().First();
                newRecette.HCuiss = (int)numericHCuiss.Value;
                newRecette.MCuiss = (int)numericMCuiss.Value;
                newRecette.HPrep = (int)numericHPrepa.Value;
                newRecette.MPrep = (int)numericHPrepa.Value;


                entitie.AddToRecettes(newRecette);
                entitie.SaveChanges();


                foreach (ListViewItem item in listViewIng.Items)
                {
                    compoRecette ingRecette = new compoRecette();

                    ingRecette.idRecette = newRecette.idRecettes;
                    ingRecette.idCompoDenree = (int)entitie.getIdDenree(item.SubItems[0].Text).ToList().First();
                    ingRecette.quantite = float.Parse(item.SubItems[1].Text);
                    ingRecette.idTypeQte = (int)entitie.getIdTypeQte(item.SubItems[2].Text).ToList().First();

                    entitie.AddTocompoRecette(ingRecette);
                    entitie.SaveChanges();
                }

                MessageBox.Show("La recette a été ajouté avec succés", "Succés", 0, MessageBoxIcon.Asterisk);
            }
            catch (UpdateException u)
            {
                MessageBox.Show(u.Message);
            }
        }
           

            




        

        private void iniCouleurCombo(ComboBox box)
        {
            box.BackColor = Color.White;
        }

        private void iniCouleur()
        {
            textBoxTitre.BackColor = Color.White;
            iniCouleurCombo(comboBoxTypeRecette);
            iniCouleurCombo(comboBoxMois);
            iniCouleurCombo(comboBoxRef);
            iniCouleurCombo(comboBoxSaison);

        }

        private void comboBoxTypeRecette_Validated(object sender, EventArgs e)
        {
            if (comboBoxTypeRecette.FindString(comboBoxTypeRecette.Text) == -1)
            {

                DialogResult result = MessageBox.Show("Voulez-vous ajouter le type : " + comboBoxTypeRecette.Text + " ? ", "Ajout d'un type", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == DialogResult.No)
                    return;

                if (result == DialogResult.Yes)
                {

                    comboBoxTypeRecette.Items.Add(comboBoxTypeRecette.Text);
                    comboBoxTypeRecette.SelectedItem = comboBoxTypeRecette.Text;
                    BddRecettesEntities entity = new BddRecettesEntities();
                    typeRecette type = new typeRecette();
                    type.TypeRecette = comboBoxTypeRecette.Text;
                    entity.AddTotypeRecette(type);
                    if (entity.SaveChanges() != 0)
                        MessageBox.Show("La référence " + comboBoxTypeRecette.Text + " a été ajouté avec succés", "Succés", 0, MessageBoxIcon.Asterisk);
                    else
                        MessageBox.Show("La référence " + comboBoxTypeRecette.Text + " n'a pu être enregistré dans la base de donnée..", "Succés", 0, MessageBoxIcon.Exclamation);

                    entity.Dispose();
                }

            }
        }

            private void remplirTreeIng() 
            {
                BddRecettesEntities entite = new BddRecettesEntities();
                try
                {
                    treeViewIngredient.Nodes.Clear();
                 
                    List<TSQLIngredient> TSQLListIng = entite.getAllIngredient().ToList();

                    TSQLIngredient TSQLBefore = new TSQLIngredient();
                    TSQLBefore = TSQLListIng.First();
                    TreeNode node = new TreeNode();

                    node = treeViewIngredient.Nodes.Add(TSQLBefore.nomCatégorie);

                    foreach (TSQLIngredient TSQLIng in TSQLListIng)
                    {
                        if (TSQLBefore.nomCatégorie != TSQLIng.nomCatégorie)
                        {
                            node = treeViewIngredient.Nodes.Add(TSQLIng.nomCatégorie);
                            TSQLBefore = TSQLIng;
                            node.Nodes.Add(TSQLIng.nom);
                        }
                        else
                            node.Nodes.Add(TSQLIng.nom);

                    }


                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                    this.Dispose();
                }
                finally
                {
                    entite.Dispose();
                }
            }

            private void buttonMiseAjour_Click(object sender, EventArgs e)
            {
                remplirTreeIng();
            }
    
        }

}
